package ar.edu.utn.frgp.banco.dao.Implements;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.Interfaces.IntPagoServicios;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.PagoServicios;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class ImpPagoServivios implements IntPagoServicios {

	@Override
	public void AltaPagoServicios(PagoServicios pagoservicio)
			throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Insert into Pagoservicios (id_cuenta,id_servicio, ");
			stringBuilder.append("fecha) ");
			stringBuilder.append("VALUES (?,?,?) ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setInt(1, pagoservicio.getId_cuenta());
			ps.setInt(2, pagoservicio.getId_servicio());
			ps.setDate(3, new java.sql.Date(pagoservicio.getFecha().getTime()));
			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	@Override
	public PagoServicios TraePagoServicios(Integer id_pagoservicio)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		PagoServicios pagoser = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_pagoservicio, id_cuenta, ");
			stringBuilder.append("id_servicio, fecha ");
			stringBuilder.append("from Pagoservicios ");
			stringBuilder.append("WHERE id_pagoservicios = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_pagoservicio);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				pagoser = new PagoServicios();
				
				pagoser.setId_pagoservicio(rs.getInt("id_pagoservicio"));
				pagoser.setId_cuenta(rs.getInt("id_cuenta"));
				pagoser.setId_servicio(rs.getInt("id_servicio"));
				pagoser.setFecha(rs.getDate("fecha"));
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return pagoser;
	}

	@Override
	public List<PagoServicios> TraePagoServicios(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<PagoServicios> pagoservicios = new ArrayList<PagoServicios>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_pagoservicio, id_cuenta, ");
			stringBuilder.append("id_servicio, fecha ");
			stringBuilder.append("from Pagoservicios ");
			stringBuilder.append("WHERE id_cuenta = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			PagoServicios pagoser = null; 
			while (rs.next()) {
				pagoser = new PagoServicios();
				
				pagoser.setId_pagoservicio(rs.getInt("id_pagoservicio"));
				pagoser.setId_cuenta(rs.getInt("id_cuenta"));
				pagoser.setId_servicio(rs.getInt("id_servicio"));
				pagoser.setFecha(rs.getDate("fecha"));
				
				pagoservicios.add(pagoser);
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return pagoservicios;
	}

	@Override
	public List<PagoServicios> TraePagoServicios(Cliente cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Cuenta> cuentas = null;
		List<PagoServicios> pagoservicios = new ArrayList<PagoServicios>();
		cuentas = cliente.getCuentas();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			for (Cuenta cuenta : cuentas){
				
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("Select id_pagoservicio, id_cuenta, ");
				stringBuilder.append("id_servicio, fecha ");
				stringBuilder.append("from Pagoservicios ");
				stringBuilder.append("WHERE id_cuenta = ?");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, cuenta.getID_Cuenta());
				
				rs = ps.executeQuery();
				PagoServicios pagoser = null; 
				while (rs.next()) {
					pagoser = new PagoServicios();
					
					pagoser.setId_pagoservicio(rs.getInt("id_pagoservicio"));
					pagoser.setId_cuenta(rs.getInt("id_cuenta"));
					pagoser.setId_servicio(rs.getInt("id_servicio"));
					pagoser.setFecha(rs.getDate("fecha"));
					
					pagoservicios.add(pagoser);
				}
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return pagoservicios;
	}

}
